package com.black.utils.office.word;

import com.black.utils.office.excel.ExcelEntity;
import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

/**
 * Word导出实体类
 * 支持层次化结构的文档内容组织
 */
@Setter
@Getter
public class WordEntity {

    /**
     * 文档标题
     */
    private String documentTitle;

    /**
     * 文档章节列表
     */
    private List<Section> sections;

    public WordEntity() {
        this.sections = new ArrayList<>();
    }

    public WordEntity(String documentTitle) {
        this();
        this.documentTitle = documentTitle;
    }

    /**
     * 添加章节
     *
     * @param section 章节对象
     */
    public void addSection(Section section) {
        sections.add(section);
    }

    /**
     * 创建并添加章节
     *
     * @param title 标题文本
     * @param level 标题级别
     * @return 创建的章节对象
     */
    public Section addSection(String title, int level) {
        Section section = new Section(title, level);
        sections.add(section);
        return section;
    }

    /**
     * 添加一级标题章节
     *
     * @param title 标题文本
     * @return 创建的章节对象
     */
    public Section addSection1(String title) {
        return addSection(title, 1);
    }

    /**
     * 添加二级标题章节
     *
     * @param title 标题文本
     * @return 创建的章节对象
     */
    public Section addSection2(String title) {
        return addSection(title, 2);
    }

    /**
     * 添加三级标题章节
     *
     * @param title 标题文本
     * @return 创建的章节对象
     */
    public Section addSection3(String title) {
        return addSection(title, 3);
    }

    /**
     * 章节类
     * 代表文档中的一个章节，包含标题和内容
     */
    @Setter
    @Getter
    public static class Section {
        private String title;
        private int level; // 1: 一级标题, 2: 二级标题, 3: 三级标题
        private List<Content> contents;

        public Section() {
            this.contents = new ArrayList<>();
        }

        public Section(String title, int level) {
            this();
            this.title = title;
            this.level = level;
        }

        /**
         * 添加段落内容
         *
         * @param text 段落文本
         */
        public void addParagraph(String text) {
            contents.add(new Content(text, ContentType.PARAGRAPH));
        }

        /**
         * 添加表格内容
         *
         * @param table 表格对象
         */
        public void addTable(ExcelEntity table) {
            contents.add(new Content(table, ContentType.TABLE));
        }

        /**
         * 添加子章节
         *
         * @param section 子章节
         */
        public void addSection(Section section) {
            contents.add(new Content(section, ContentType.SECTION));
        }

        /**
         * 创建并添加子章节
         *
         * @param title 标题文本
         * @param level 标题级别
         * @return 创建的子章节对象
         */
        public Section addSection(String title, int level) {
            Section section = new Section(title, level);
            contents.add(new Content(section, ContentType.SECTION));
            return section;
        }

        /**
         * 添加一级标题子章节
         *
         * @param title 标题文本
         * @return 创建的子章节对象
         */
        public Section addSection1(String title) {
            return addSection(title, 1);
        }

        /**
         * 添加二级标题子章节
         *
         * @param title 标题文本
         * @return 创建的子章节对象
         */
        public Section addSection2(String title) {
            return addSection(title, 2);
        }

        /**
         * 添加三级标题子章节
         *
         * @param title 标题文本
         * @return 创建的子章节对象
         */
        public Section addSection3(String title) {
            return addSection(title, 3);
        }

    }

    /**
     * 内容类型枚举
     */
    public enum ContentType {
        PARAGRAPH,  // 段落
        TABLE,      // 表格
        SECTION     // 子章节
    }

    /**
     * 内容类
     * 代表章节中的具体内容
     */
    @Setter
    @Getter
    public static class Content {
        private Object data;
        private ContentType type;

        public Content() {
        }

        public Content(Object data, ContentType type) {
            this.data = data;
            this.type = type;
        }
    }
}
